using Godot;
using System;
using System.Collections.Generic;

public partial class 角色加点 : PanelContainer
{
    [Export] private Label 名称标签;
    [Export] private Label 体力标签;
    [Export] private Label 精力标签;
    [Export] private Label 物伤标签;
    [Export] private Label 神伤标签;
    [Export] private Label 速度标签;
    [Export] private Label 防御标签;
    [Export] private Label 属性点标签;
    [Export] private Label 体质标签;
    [Export] private SpinBox 体质输入框;
    [Export] private Label 体质增减标签;
    [Export] private Label 爆发标签;
    [Export] private SpinBox 爆发输入框;
    [Export] private Label 爆发增减标签;
    [Export] private Label 精神标签;
    [Export] private SpinBox 精神输入框;
    [Export] private Label 精神增减标签;
    [Export] private Label 敏捷标签;
    [Export] private SpinBox 敏捷输入框;
    [Export] private Label 敏捷增减标签;
    [Export] private Button 重置按钮;
    [Export] private Button 确认按钮;

    private int 可分配属性点 = 0;
    private readonly Dictionary<string, int> 当前分配 = new()
    {
        { "体质", 0 },
        { "爆发", 0 },
        { "精神", 0 },
        { "敏捷", 0 },
    };

    public override void _Ready()
    {
        体质输入框.ValueChanged += Value =>
        {
            输入框值被改变(体质输入框, "体质");
        };
        爆发输入框.ValueChanged += Value =>
        {
            输入框值被改变(爆发输入框, "爆发");
        };
        精神输入框.ValueChanged += Value =>
        {
            输入框值被改变(精神输入框, "精神");
        };
        敏捷输入框.ValueChanged += Value =>
        {
            输入框值被改变(敏捷输入框, "敏捷");
        };

        重置按钮.Pressed += 重置面板;

        确认按钮.Pressed += () =>
        {
            var 分配总额 = 当前分配["体质"] + 当前分配["爆发"] + 当前分配["精神"] + 当前分配["敏捷"];
            if (分配总额 == 0)
            {
                return;
            }
            if (分配总额 > (int)游戏存档.玩家.基础属性.未分配的点数)
            {
                游戏管理.日志实例.置失败文本("已分配的属性点大于待分配的属性点！");
                return;
            }

            游戏存档.玩家.战斗属性.体质 += 当前分配["体质"];
            游戏存档.玩家.战斗属性.爆发 += 当前分配["爆发"];
            游戏存档.玩家.战斗属性.精神 += 当前分配["精神"];
            游戏存档.玩家.战斗属性.敏捷 += 当前分配["敏捷"];
            游戏存档.玩家.基础属性.未分配的点数 = 游戏存档.玩家.基础属性.未分配的点数 - 分配总额;

            初始化();
        };
    }

    public void 初始化()
    {
        名称标签.Text = 游戏存档.玩家.基础属性.名称;
        var 玩家副本 = 游戏存档.玩家.取综合属性(游戏管理.装备栏实例.取装备栏战斗属性());
        体力标签.Text = ((int)玩家副本.战斗属性.体力).ToString();
        精力标签.Text = ((int)玩家副本.战斗属性.精力).ToString();
        物伤标签.Text = ((int)玩家副本.战斗属性.物伤).ToString();
        神伤标签.Text = ((int)玩家副本.战斗属性.神伤).ToString();
        速度标签.Text = ((int)玩家副本.战斗属性.速度).ToString();
        防御标签.Text = ((int)玩家副本.战斗属性.防御).ToString();

        可分配属性点 = (int)游戏存档.玩家.基础属性.未分配的点数;
        属性点标签.Text = 可分配属性点.ToString();

        体质标签.Text = 玩家副本.战斗属性.体质.ToString();
        爆发标签.Text = 玩家副本.战斗属性.爆发.ToString();
        精神标签.Text = 玩家副本.战斗属性.精神.ToString();
        敏捷标签.Text = 玩家副本.战斗属性.敏捷.ToString();

        体质输入框.MaxValue = 可分配属性点;
        爆发输入框.MaxValue = 可分配属性点;
        精神输入框.MaxValue = 可分配属性点;
        敏捷输入框.MaxValue = 可分配属性点;

        重置面板();
    }

    private void 输入框值被改变(SpinBox 输入框, string 属性)
    {
        // 判断是增加
        if (输入框.Value > 当前分配[属性] && 可分配属性点 == 0)
        {
            输入框.Value = 当前分配[属性];
            return;
        }
        当前分配[属性] = (int)输入框.Value;
        更新剩余属性点();
    }

    private void 更新剩余属性点()
    {
        可分配属性点 = (int)游戏存档.玩家.基础属性.未分配的点数 -
        当前分配["体质"] -
        当前分配["爆发"] -
        当前分配["精神"] -
        当前分配["敏捷"];
        属性点标签.Text = 可分配属性点.ToString();
    }

    private void 重置面板()
    {
        当前分配["体质"] = 0;
        当前分配["爆发"] = 0;
        当前分配["精神"] = 0;
        当前分配["敏捷"] = 0;
        可分配属性点 = (int)游戏存档.玩家.基础属性.未分配的点数;
        体质输入框.Value = 0;
        爆发输入框.Value = 0;
        精神输入框.Value = 0;
        敏捷输入框.Value = 0;
        属性点标签.Text = 可分配属性点.ToString();
    }
}
